package com.zhang.mysql.common.model;

import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * description
 *
 * @author zhangFanJun
 * @date 2023-07-19 9:59
 **/
@Slf4j
public class KingHoodPageUtil {

    /**
     * 字段排序
     *
     * @param in 分页请求
     * @return 分页数据
     * @author zfj
     * @date 2022/9/8
     */
    public static <T> Page<T> getPage(KingPageReqDTO in, KingHoodDefaultSort defaultSort) {
        if (Objects.isNull(in.getPage())) {
            in.setPage(new BasePage());
        }
        Page<T> page = new Page<>(in.getPage().getPageNum(), in.getPage().getPageSize());
        OrderItem orderItem = new OrderItem();
        if (StringUtils.isBlank(in.getPage().getOrderBy())) {
            page.addOrder(defaultSort.getDefaultSort().toArray(new OrderItem[0]));
        } else {
            orderItem.setColumn(in.getPage().getOrderBy());
            orderItem.setAsc(Objects.equals(in.getPage().getSort(), BasePage.ASC));
            page.addOrder(orderItem);
        }

        if (CollectionUtils.isNotEmpty(defaultSort.getTailSort())) {
            page.addOrder(defaultSort.getTailSort().toArray(new OrderItem[0]));
        }
        return page;
    }

    /**
     * 手动分页
     *
     * @param inPage 分页
     * @param list   列表数据
     * @param result 其他
     * @return 分页数据
     * @author zfj
     * @date 2023/7/19
     */
    public static <T> PageResponseVO<T> manualPage(PageReqDTO inPage, List<T> list, Map<String, Object> result) {
        long p = list.size() / inPage.getPageSize();
        if (list.size() % inPage.getPageSize() > 0) {
            p += 1;
        }
        List<T> re = null;
        if (inPage.getPageNum() == p) {
            re = list.subList((int) ((inPage.getPageNum() - 1) * inPage.getPageSize()),
                    list.size());
        } else if (inPage.getPageNum() < p) {
            re = list.subList((int) ((inPage.getPageNum() - 1) * inPage.getPageSize()),
                    (int) (inPage.getPageNum() * inPage.getPageSize()));
        }
        return new PageResponseVO<T>(inPage.getPageNum(), list.size(), p, re, result);
    }


}
